package java01;

import org.junit.Test;

import java.io.IOException;
import java.util.logging.*;

public class LoggerTest {
    //未被任何变量引用的日志记录器可能被垃圾回收，引用一个静态变量可以防止
    private static final Logger myLogger=Logger.getLogger("LoggerTest");//创建日志记录器

    public void test(){
        myLogger.entering("java01.LoggerTest","test()",new Object[]{null});
    }

    @Test
    public void loggerTest01() throws IOException {
//        Thread.dumpStack();
        Logger logger = Logger.getLogger("java01");//获得给定名称日志记录器，如不存在则创建一个
        logger.setLevel(Level.ALL);
        logger.setUseParentHandlers(false);//设置是否使用父处理器，true则日志记录器将全部日志记录发给父处理器

        Handler handler =new ConsoleHandler();//自定义控制台处理器，将FINE级别及以上打印到控制台
        handler.setLevel(Level.FINE);
        handler.setFormatter(new Formatter() {//自定义格式化器
            @Override
            public String format(LogRecord record) {
                return record.getMessage();
            }
        });
        logger.addHandler(handler);

        FileHandler fileHandler = new FileHandler("%h/myLog.log",0,10,true);//自定义文件处理器，将FINE级别及以上打印到文件，默认用户->java0.log，append追加
        logger.addHandler(fileHandler);

        logger.setFilter(record -> record.getMessage().startsWith("RETURN"));//自定义日志过滤器
        logger.info("打印logger");
    }

    public static void main(String[] args) {
        Logger.getGlobal().info("file->open menu item selected");//全局日志记录器，调用info级别及以上
//        Logger.getGlobal().setLevel(Level.OFF);//取消所有日志
        myLogger.setLevel(Level.ALL);//开启所有日志级别
        myLogger.warning("开启warning");//警告
        myLogger.fine("开启fine");
        myLogger.logp(Level.INFO,"test","aa","main()",new Object[]{args});//获取类和方法的确切位置
        new LoggerTest().test();
        try {
            throw new IOException();
        } catch (IOException e) {
            myLogger.log(Level.INFO,"java01.LoggerTest");
        }
    }
}
